#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>

int flag = 0;
void sighandler(int signum)
{
    printf("catch a sig:%d\n", signum);
    flag = 1;
}
int main()
{
    signal(2, sighandler);

    while (!flag)
        ;
    printf("process quit normal\n");
    return 0;
}

// struct sigaction act, oact;
// void sighandler(int signum)
// {
//     printf("catch a sig;%d\n", signum);
//     // 用原来的方式捕捉2号信号
//     sigaction(SIGINT, &oact, NULL);
// }
// int main()
// {
//     memset(&act, 0, sizeof(act));
//     memset(&oact, 0, sizeof(oact));

//     act.sa_handler = sighandler;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);

//     sigaction(SIGINT, &act, &oact);
//     while (1)
//     {
//         sleep(1);
//         printf("----->pid:%d<-----\n", getpid());
//     }
//     return 0;
// }

// void printsignal(sigset_t *set)
// {
//     int i = 1;
//     for (; i < 32; i++)
//     {
//         if (sigismember(set, i))
//         {
//             printf("1 ");
//         }
//         else
//         {
//             printf("0 ");
//         }
//     }
//     printf("\n");
// }

// int main()
// {
//     sigset_t set, oset;
//     sigemptyset(&set);
//     sigemptyset(&oset);
//     sigaddset(&set, 2);
//     sigaddset(&set, 3);
//     sigaddset(&set, 4);
//     sigprocmask(SIG_BLOCK, &set, NULL);
//     int count = 10;
//     while (1)
//     {
//         sleep(2);
//         printf("----->pid:%d<-----\n", getpid());
//         count--;
//         if (count == 0)
//         {
//             sigpending(&oset);
//             printsignal(&oset);
//             return 1;
//         }
//     }
//     return 0;
// }

// void printsignal(sigset_t *set)
// {
//     int i = 1;
//     for (; i < 32; i++)
//     {
//         if (sigismember(set, i))
//         {
//             printf("1 ");
//         }
//         else
//         {
//             printf("0 ");
//         }
//     }
//     printf("\n");
// }

// int main()
// {
//     sigset_t set, oset;
//     sigemptyset(&set);
//     sigemptyset(&oset);
//     sigaddset(&set, 2);
//     // 阻塞2号信号
//     sigprocmask(SIG_BLOCK, &set, &oset);
//     int count = 10;
//     while (1)
//     {
//         sleep(1);
//         printf("**********\n");
//         count--;
//         if (count == 0)
//         {
//             printsignal(&oset);
//             printf("\n");
//             // 解除对2号信号的阻塞
//             sigprocmask(SIG_UNBLOCK, &set, &oset);
//             printsignal(&oset);
//         }
//     }
//     return 0;
// }

// int main()
// {
//     alarm(2);
//     while (1)
//     {
//         printf("----------\n");
//         sleep(1);
//     }
//     return 0;
// }